package com.example.util;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

/**
 * 生成验证码的字符串
 * 根据验证码字符串画出图片
 */
public class CodeUtil {

    /**
     * 准备一个字符的数组，用来存储验证码的所有字符可能
     * 已去除了字母o和l
     */
    public static final char[] codes = {
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
            'k', 'm', 'n', 'p', 'q', 'r', 's', 't',
            'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2',
            '3', '4', '5', '6', '7', '8', '9'};

    /**
     * 生成指定位数的随机验证码
     * @param len 字符个数
     * @return 验证码字符串
     */
    public static String randomCode(int len) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < len; i++) {
            /* 0 <= index <= codes.length - 1 */
            int index = random.nextInt(codes.length);
            sb.append(codes[index]);
        }
        return sb.toString();
    }

    /**
     * 根据验证码获取一个图片
     * @param code 验证码字符串
     * @return 图片的对象
     */
    public static BufferedImage getCodeImage(String code) {
        // 图片宽
        int width = 200;
        // 图片高
        int height = 50;
        /* 定义一个图片对象 */
        BufferedImage image = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        /* 获取一个该图片的画笔对象 */
        Graphics graphics = image.getGraphics();
        /* 填充背景 */
        graphics.setColor(Color.orange);
        // 从(0, 0)开始画，画width宽度，height高度
        graphics.fillRect(0, 0, width, height);
        /* 画出验证码字符 */
        // 设置颜色
        graphics.setColor(Color.black);
        // 定义字体，字号表示的是字符的高度，至于宽度根据字体的形状决定的
        final int fontSize = 30;
        graphics.setFont(new Font("楷体", Font.BOLD, fontSize));
        // 字符的个数
        int count = code.length();
        // 每个字符左右的大概间距
        int w = (width - count * fontSize * 9 / 10) / (count + 1);
        // 初始位置在一个间距的位置
        int x = w;
        final int y = 35;
        for (int i = 0; i < count; i++) {
            graphics.drawString(String.valueOf(code.charAt(i)),
                    x, y);
            x += (fontSize * 9 / 10);
            x += w;
        }
        /* 画干扰线 */
        Random random = new Random();
        /* 0 <= x1 <40, 0<= y1 <50 */
        /* 160 <= x2 <200, 0<= y2 <50 */
        for (int i = 0; i < 5; i++) {
            graphics.drawLine(random.nextInt(40),
                    random.nextInt(50),
                    random.nextInt(40) + 160,
                    random.nextInt(50));
        }
        /* 关闭这个画笔 */
        graphics.dispose();
        return image;
    }
}
